//package com.ocom.exposeapi.util;
//
//import com.ocom.redis.util.RedisUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.data.redis.core.RedisCallback;
//import org.springframework.data.redis.serializer.RedisSerializer;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.util.List;
//
///**
// * 滑动窗口计数
// *
// * @author yangzihe
// * @date 2023/8/8
// */
//@Component
//@Slf4j
//public class SlidingWindowCounter {
//
//
//    @Resource
//    private RedisUtil redisUtil;
//
//
//    /**
//     * 数据统计-判断数量是否超过最大限定值
//     *
//     * @param key        redis key
//     * @param windowTime 窗口时间，单位：秒
//     * @param maxNum     最大数量
//     *
//     * @return true-超过 false-未超过
//     */
//    public boolean countOver(String key, int windowTime, long maxNum) {
//        // 窗口结束时间
//        long windowEndTime = System.currentTimeMillis();
//        // 窗口开始时间
//        long windowStartTime = windowEndTime - windowTime * 1000L;
//
//        // 按score统计key的value中的有效数量
//        Long count = redisUtil.listSetSize(key, windowStartTime, windowEndTime);
//        if (count == null) {
//            return false;
//        }
//        return count > maxNum;
//    }
//
//    /**
//     * 数据上报-滑动窗口计数增长
//     *
//     * @param key        redis key
//     * @param windowTime 窗口时间，单位：秒
//     */
//    public void increment(String key, Integer windowTime) {
//        // 窗口结束时间
//        long windowEndTime = System.currentTimeMillis();
//        // 窗口开始时间
//        long windowStartTime = windowEndTime - windowTime * 1000L;
//
//        RedisCallback<List<Object>> pipelineCallback = (connection) -> {
//            RedisSerializer<String> serializer = redisUtil.redisSerializer();
//
//            // 在管道中执行多个 ZSet 命令
//            connection.openPipeline();
//
//            // 添加当前时间 value=当前时间戳 score=当前时间戳
//            connection.zAdd(serializer.serialize(key), windowEndTime, serializer.serialize(String.valueOf(windowEndTime)));
//            // 清除窗口过期成员
//            connection.zRemRangeByScore(serializer.serialize(key), 0, windowStartTime);
//            // 设置key过期时间
//            connection.expire(serializer.serialize(key), windowTime);
//
//            return connection.closePipeline();
//        };
//
//        // 执行管道操作
//        redisUtil.executePipelined(pipelineCallback);
//    }
//
//}
